模块机制

# 模块机制

[TOC]

# 一、CommonJS规范

  • 目标:为了构建JavaScript在包括Web服务器,桌面,命令行工具,及浏览器方面的生态系统。

# 1.1 简单模块定义

// circle.js
const PI = Math.PI
exports.area = (r) => {
    return PI * r * r
}
exports.circumference = (r) => {
    return 2 * PI * r
}
1
2
3
4
5
6
7
8
// app.js
const circle = require('./circle.js')
console.log('The area of a circle of radius 4 is' + circle.area(4))
1
2
3

# 1.2 模块载入策略

  • Node.js的模块分为两类,一类为原生模块(核心),一类为文件模块。
  • Node.js对原生模块和文件模块都进行了缓存,于是在第二次require时,是不会有重复开销的。

# 1.2.1 原生模块

  • 原生模块在Node.js源代码编译的时候编译进了二进制执行文件,加载的速度最快。

# 1.2.2 文件模块

  • 以后缀不同分成三类模块
    • .js:通过fs模块同步读取js文件并编译执行。
    • .node:通过C/C++进行编写的Addon,通过dlopen方法进行加载。
    • .json:读取文件,调用JSON.parse解析加载。

# 1.2.3 require方法中的文件查找策略

  • 优先级
    1. 从文件模块缓存中加载
    2. 从原生模块加载
    3. 从文件加载

# 二、包结构

JavaScript缺少包结构,CommonJS致力于改变这种现状,于是定义了包的结构规范。

而NPM(包管理器)的出现则是为了在CommonJS规范的基础上,实现解决包的安装卸载,依赖管理,版本管理等问题。

  • 一个符合CommonJS规范的包应该是如下这种结构
    • package.json:包描述文件。
    • bin:用于存放可执行二进制文件的目录。
    • lib:用于存放JavaScript代码的目录。
    • doc:用于存放文档的目录。
    • test:用于存档单元测试用例的代码。